home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / dev_libs / feelin040718 / sources / text / object.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  5KB  |  204 lines

  1. #include "Private.h"
  2.  
  3. #undef F_STORE
  4. #define F_STORE(val)            *((ULONG *)(item -> ti_Data)) = (ULONG)(val)
  5.  
  6. /*** Methods ***************************************************************/
  7.  
  8. ///Text_New
  9. F_METHOD(ULONG,Text_New)
  10. {
  11.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  12.  
  13.    /* Default values */
  14.  
  15.    LOD -> Flags    = FF_Text_Static | FF_Text_Shortcut;
  16.    LOD -> AreaData = (FAreaData *) F_Get(Obj,FA_AreaData);
  17.  
  18.    return F_SuperDo(Class,Obj,Method,
  19.  
  20.       FA_SetMin,        TRUE,
  21.  
  22.    TAG_MORE,Msg);
  23. }
  24. //+
  25. ///Text_Dispose
  26. F_METHOD(ULONG,Text_Dispose)
  27. {
  28.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  29. /*
  30.    F_DisposeObj(LOD -> TextDisplay);   LOD -> TextDisplay = NULL;
  31. */
  32.    if (!(FF_Text_Static & LOD -> Flags))
  33.    {
  34.       F_Dispose(LOD -> Text);
  35.    }
  36.  
  37.    LOD -> Text = NULL;
  38.  
  39.    return F_SUPERDO();
  40. }
  41. //+
  42. ///Text_Set
  43.  
  44. #define FF_UPDATE_CONTENTS                      (1 << 0)
  45. #define FF_UPDATE_PREP                          (1 << 1)
  46. #define FF_UPDATE_ALTPREP                       (1 << 2)
  47. #define FF_UPDATE_STATE                         (1 << 3)
  48. #define FF_UPDATE_FONT                          (1 << 4)
  49. #define FF_UPDATE_SHORTCUT                      (1 << 5)
  50.  
  51. F_METHOD(void,Text_Set)
  52. {
  53.    struct LocalObjectData *LOD  = F_LOD(Class,Obj);
  54.    struct TagItem         *Tags = Msg,
  55.                           *item;
  56.  
  57.    BOOL update=0;
  58.    BOOL selected = (0 != (FF_Area_Selected & _flags));
  59.    BOOL tag_selected=FALSE;
  60.  
  61.    while  (item = NextTagItem(&Tags))
  62.    switch (item -> ti_Tag)
  63.    {
  64.       case FA_Selected:
  65.       {
  66.          tag_selected = TRUE;
  67.          selected = item -> ti_Data;
  68.  
  69.          if (LOD -> Prep[0] != LOD -> Prep[1] && LOD -> Prep[1] != NULL) update |= FF_UPDATE_STATE;
  70.       }
  71.       break;
  72.  
  73.       case FA_Font:
  74.       {
  75.          update |= FF_UPDATE_FONT;
  76.       }
  77.       break;
  78.  
  79.       /****/
  80.  
  81.       case FA_Text:
  82.       {
  83.          update |= FF_UPDATE_CONTENTS;
  84.  
  85.          if (FF_Text_Static & LOD -> Flags)
  86.          {
  87.             LOD -> Text = (STRPTR)(item -> ti_Data);
  88.          }
  89.          else
  90.          {
  91.             ULONG len;
  92.  
  93.             F_Dispose(LOD -> Text); LOD -> Text = NULL;
  94.  
  95.             if (len = F_StrLen((STRPTR)(item -> ti_Data)))
  96.             {
  97.                if (LOD -> Text = F_New(len+1))
  98.                {
  99.                   CopyMem((APTR)(item -> ti_Data),LOD -> Text,len);
  100.                }
  101.             }
  102.          }
  103.       }
  104.       break;
  105.  
  106.       case FA_Text_PreParse:
  107.       {
  108.          update |= FF_UPDATE_PREP;
  109.  
  110.          LOD -> Prep[0] = (STRPTR)(item -> ti_Data);
  111.       }
  112.       break;
  113.       
  114.       case FA_Text_AltPreParse:
  115.       {
  116.          update |= FF_UPDATE_ALTPREP;
  117.  
  118.          LOD -> Prep[1] = (STRPTR)(item -> ti_Data);
  119.       }
  120.       break;
  121.  
  122.       case FA_Text_Shortcut:
  123.       {
  124.          update |= FF_UPDATE_SHORTCUT;
  125.  
  126.          if (item -> ti_Data) LOD -> Flags |= FF_Text_Shortcut;
  127.          else                 LOD -> Flags &= ~FF_Text_Shortcut;
  128.       }
  129.       break;
  130.  
  131.       case FA_Text_HCenter:      if (item -> ti_Data) LOD -> Flags |= FF_Text_HCenter; else LOD -> Flags &= ~FF_Text_HCenter; break;
  132.       case FA_Text_VCenter:      if (item -> ti_Data) LOD -> Flags |= FF_Text_VCenter; else LOD -> Flags &= ~FF_Text_VCenter; break;
  133. /*FIXME:
  134.  
  135.    Si pas encore de buffer créer et copier. Si buffer mettre à zéro et détruire
  136.  
  137. */
  138.       case FA_Text_Static:       if (item -> ti_Data) LOD -> Flags |= FF_Text_Static;  else LOD -> Flags &= ~FF_Text_Static;  break;
  139.    }
  140.  
  141.    if (update && _render)
  142.    {
  143.       STRPTR prep;
  144.  
  145.       if (FF_UPDATE_PREP & update)
  146.       {
  147.          LOD -> Prep[0] = (STRPTR) F_Do(_app,FM_Application_Resolve,LOD -> Prep[0],NULL);
  148.       }
  149.  
  150.       if (FF_UPDATE_ALTPREP & update)
  151.       {
  152.          LOD -> Prep[1] = (STRPTR) F_Do(_app,FM_Application_Resolve,LOD -> Prep[1],NULL);
  153.       }
  154.  
  155.       prep = LOD -> Prep[selected ? 1 : 0];
  156.       if (!prep) prep = LOD -> Prep[0];
  157.  
  158.       F_Do(LOD -> TextDisplay,FM_Set,
  159.                               FA_TextDisplay_PreParse, prep,
  160.                               FA_TextDisplay_Contents, LOD -> Text,
  161.                               FA_TextDisplay_Shortcut, (0 != (FF_Text_Shortcut & LOD -> Flags)),
  162.                               TAG_DONE);
  163.  
  164.       F_Set(Obj,FA_ControlChar,F_Get(LOD -> TextDisplay,FA_TextDisplay_Shortcut));
  165.    }
  166.  
  167.    F_SUPERDO();
  168.  
  169.    if (update && _render)
  170.    {
  171.       if (FF_UPDATE_FONT & update)
  172.       {
  173.          F_Set(LOD -> TextDisplay,FA_TextDisplay_Font,(ULONG)(_font));
  174.       }
  175.  
  176.       if (!tag_selected && !(FF_UPDATE_FONT & update))
  177.       {
  178.          F_Draw(Obj,FF_Draw_Update);
  179.       }
  180.    }
  181. }
  182. //+
  183. ///Text_Get
  184. F_METHOD(void,Text_Get)
  185. {
  186.    struct LocalObjectData *LOD  = F_LOD(Class,Obj);
  187.    struct TagItem         *Tags = Msg,
  188.                           *item;
  189.  
  190.    F_SUPERDO();
  191.  
  192.    while  (item = NextTagItem(&Tags))
  193.    switch (item -> ti_Tag)
  194.    {
  195.       case FA_Text:             F_STORE(LOD -> Text);    break;
  196.       case FA_Text_PreParse:    F_STORE(LOD -> Prep[0]); break;
  197.       case FA_Text_AltPreParse: F_STORE(LOD -> Prep[1]); break;
  198.       case FA_Text_HCenter:     F_STORE(FALSE != (FF_Text_HCenter & LOD -> Flags)); break;
  199.       case FA_Text_VCenter:     F_STORE(FALSE != (FF_Text_VCenter & LOD -> Flags)); break;
  200.       case FA_Text_Static:      F_STORE(FALSE != (FF_Text_Static  & LOD -> Flags)); break;
  201.    }
  202. }
  203. //+
  204.